#include <iostream>
#include <fstream>
#include <string>
#include <list>

#include "client.h"
#include "contact_list.h"


//#define configuration "/home/roman/NetBeansProjects/IM/im_config.conf"
#define configuration "im_config.conf"

using namespace std;

list <client> contact_list::read_conf(list <client> zoznam_klientov) { // prepis configu do list

    int index=0;
    string line;
    ifstream config; // nastavenie suboru pre citanie

    config.open(configuration); // priradenie suboru

    if (config.is_open()) { // kontrola uspenosti otvorenia suboru
        getline(config, line); // precitanie prveho riadku kde nie je potrebné info


        while (config.good()) { // citame kym nie sme na konci
            getline(config, line); //precitanie riadku do stringu line

            if (line.find("@") != string::npos) { // ak string obsahuje deliaci znak tak to rozpitvame, ak nie citame dalej
                string ip = line.substr(line.find("@") + 1); // ziskanie mena
                string name = line.substr(0, line.find("@")); //ziskanie ip

                zoznam_klientov.push_back(client(index++,name, ip)); // vlozenie mena a ip do zoznamu
            }
        }

        config.close(); // zatvorenie suboru po praci
    } else {
        cout << "Error: Cannot open config file" << endl;
    } // chybova hlaska ak sa nepodarilo otvorit config. subor

    return zoznam_klientov; // funkcia vrati list s klientmi

}

void contact_list::write_conf(list <client> zoznam) { // ulozenie zoznamu do suboru

    list<client>::iterator p = zoznam.begin(); // iterator pre prechadzanie zoznamu

    ofstream config; //nastavenie suboru pre zapis
    config.open(configuration); // priradenie suboru

    config << "//server" << endl; // hlavicka pre nastavenie servera
    config << p->get_name() << "@" << p->get_ip() << endl; //vlozenie ip servera
    p++; // posun na dalsi prvok zoznamu
    config << "\n//klienti" << endl; // vlozenie hlavicky pre zoznam klientov

    while (p != zoznam.end()) { // prechod listom
        config << p->get_name() << "@" << p->get_ip() << endl; // zapis udajov do suboru
        p++;
    }

    cout << "Zoznam aktualizovany" << endl;
    putchar('\n');
}

list <client> contact_list::add_client(list<client> zoznam, string name, string ip) { // funkcia pre pridanie klienta do zoznamu
    list<client>::iterator p=zoznam.end();
    p--;
    int index=p->get_index()+1;
  //  cout << p->get_index() << index << endl;
    zoznam.push_back(client(index,name,ip)); // vlozenie udajov do zoznamu
    cout << "zaznam pridany" << endl;
    putchar('\n');
//    write_conf(zoznam); // ulozenie zoznamu aby v pripade padu programu bol aktualny zoznam ulozeny
    return zoznam;

}

list<client> contact_list::remove_client(list<client> zoznam, int id) { // funkcia pre zmazanie klienda zo zoznamu, odstrani vsetky vyskyty pre danu podmienku

    for (list<client>::iterator p = zoznam.begin(); p != zoznam.end(); ++p) { // prechadzanie zoznamu pomocou for cyklu
        if (p->get_index() == id ) { // ak sa nasla dana polozka,zmaze sa na zaklade pozicie v zozname
        cout << "Zaznam " << p->get_index() << " " << p->get_name() << " zmazany" << endl;
        putchar('\n');
        p = zoznam.erase(p);
        }
    }
   // write_conf(zoznam); // ulozenie zmien
    return zoznam;
}



void contact_list::show_all(list<client> zoznam){

    for (list<client>::iterator p = zoznam.begin(); p != zoznam.end(); ++p) { // prechadzanie zoznamu pomocou for cyklu
        cout << p->get_index() << " " <<  p->get_name() << "  " << p->get_ip() << endl;
        // vypis na stdout
    }

}

